package 题目集.滑动窗口;

import java.util.*;

/**
 * 题目：https://www.acwing.com/problem/content/1240/
 */
public class 日志统计 {
    /**
     * 暴力思路：
     *      枚举每一个有效时间作为起点s，统计s到s+T的时间内每个用户获得的点赞。如果有>k的点赞，则记录答案；
     * 滑动窗口思路：
     *      维护一个长度最小长度为D的窗口，记录窗口内每个用户的点赞数量。
     *      当窗口中不存在点赞数量>k的用户时，窗口右扩，对应的用户点赞数量+1。
     *      当窗口中存在点赞数量>k的用户时，窗口左缩，直到窗口中不存在点赞数量>k的用户，或者窗口<D。
     *
     *      窗口与答案指标的单调性关系：
     *          窗口右扩，点赞数量增加，越有可能符合答案（递增）；
     *          窗口左缩，点赞数量减少，越难符合答案（递减）；
     */
    static int MaxN = 100001;
    static int[][] logs;     //记录每个时间点的用户点赞
    static int[] ids = new int[MaxN];  //记录窗口中每个用户的点赞数量
    static int n, d, k;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        d = sc.nextInt();
        k = sc.nextInt();
        logs = new int[n][2];
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
            int t = sc.nextInt();
            int id = sc.nextInt();
            logs[cnt][0] = t;
            logs[cnt++][1] = id;
        }
        Arrays.sort(logs, (o1, o2) -> o1[0] - o2[0]);
        //记录窗口中点赞数量>=k的用户
        BitSet bitSet = new BitSet();
        for (int i = 0, j = 0; j < logs.length; j++) {
            ids[logs[j][1]]++;
            if (ids[logs[j][1]] >= k) {
                while (ids[logs[j][1]] >= k && logs[j][0] - logs[i][0] >= d) {  //这里>=，是因为比的是时间，不是下标
                    ids[logs[i][1]]--;
                    i++;
                }
                if (ids[logs[j][1]]>=k){
                    bitSet.set(logs[j][1]);
                }
            }
        }
        bitSet.stream().forEach(System.out::println);
    }
}
